package com.yyge.web.filrter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebFilter("/*")
public class B_CORS_Filrter implements Filter {
    private  static Logger logger= LoggerFactory.getLogger(B_CORS_Filrter.class);
    /**
     * filter是一个运行中的对象，在用户请求达到servlet之前执行。
     * 过滤器中可以根据业务逻辑来决定请求是否放行；
     *  如果过滤器没有放行请求，则过滤器中直接将结果响应给客户端，
     *  请求没有达到servlet如果过滤器放行了请求，则将请求传递到下一个过滤器，
     *  如果已经没有了后续过滤器，则执行servlet
     *  当servlet响应请求时，同样也会按照过滤器的执行流程的倒序执行一次
     *
     *  init,doDFilter,destroy三个方法属于Filter过滤器生命周期方法
     * @param filterConfig
     * @throws ServletException
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
       logger.debug("跨域设置: 过滤器对象被web容器初始化以后执行的方法；--------init--------");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      logger.debug("跨域设置:过滤器接收到来自客户端的请求:--------doFilter--------");
        //如果放行请求，则执行chain中的方法
        // 如果不放行请求，则执行响应，不要执行chain的方法

        HttpServletRequest req=(HttpServletRequest)servletRequest;
        HttpServletResponse resp=(HttpServletResponse)servletResponse;

        //Access-Control-Allow-Origin允许哪些url地址进行访问
        resp.setHeader("Access-Control-Allow-Origin", "*"); // 允许任意前端程序访问
        // 多长时间内不用再发起第二次预检的请求,单位秒
        resp.setHeader("Access-Control-Max-Age", "1800");
        // 告诉客户端，服务器支持的请求方法
        resp.setHeader("Access-Control-Allow-methods", "*");//GET POST....
        // 服务器允许客户端自定义的请求头参数
        resp.setHeader("Access-Control-Allow-Headers", "*");
        // 是否允许客户端缓存数据
        resp.setHeader("Access-Control-Allow-Credentials", "false");

        filterChain.doFilter(req,resp);//进入下一个过滤器或者servlet

        logger.debug("跨域设置:过滤器响应客户端请求");
    }

    @Override
    public void destroy() {
        //服务器重启，关闭时执行过滤器的销毁方法
      logger.debug("跨域设置：执行销毁方法，--------destroy--------");
    }
}
